#include <iostream>
#include <string>
#include <vector>
#include <functional>
#include <unistd.h>
#include <signal.h>
#include <stdlib.h>
#include <sys/wait.h>

int main()
{
    if (fork() == 0)
    {
        sleep(1);
        int a = 10;
        a /= 0;

        exit(0);
    }

    int status = 0;
    waitpid(-1, &status, 0);

    printf("exit signal: %d, core dump: %d\n", status&0x7F, (status>>7)&1);
    return 0;
}

// void handler(int signo)
// {
//     std::cout << "get a signo: " << signo << std::endl;
//     // 我捕捉了11/8号信号，没执行默认动作哦。也没有退出进程哦！
// }

// int main()
// {
//     std::cout << "hello world" << std::endl;
//     std::cout << "hello world" << std::endl;
//     std::cout << "hello world" << std::endl;
//     std::cout << "hello world" << std::endl;
//     std::cout << "hello world" << std::endl;
//     std::cout << "hello world" << std::endl;
//     std::cout << "hello world" << std::endl;
//     std::cout << "hello world" << std::endl;
//     std::cout << "hello world" << std::endl;
//     std::cout << "hello world" << std::endl;
//     std::cout << "hello world" << std::endl;
//     std::cout << "hello world" << std::endl;
//     std::cout << "hello world" << std::endl;
//     std::cout << "hello world" << std::endl;
//     std::cout << "hello world" << std::endl;
//     std::cout << "hello world" << std::endl;
//     std::cout << "hello world" << std::endl;
//     // signal(8, handler);
//     int a = 10;
//     a /= 0;
//     int *p = nullptr;
//     *p = 100;
//     std::cout << "hello world" << std::endl;
//     std::cout << "hello world" << std::endl;
//     std::cout << "hello world" << std::endl;
//     std::cout << "hello world" << std::endl;

//     // alarm(1);
//     while(true);
// }

// using fun_t = std::function<void()>;
// long long gcount = 0;
// std::vector<fun_t> gfuncs;

// void hanlder(int signo)
// {
//     for (auto &f : gfuncs)
//     {
//         f();
//     }
//     std::cout<<"gcount : "<<gcount<<std::endl;
//     alarm(1);
// }

// int main()
// {
//     gfuncs.push_back([](){std::cout<<"我是一个日志任务"<<std::endl;});
//     gfuncs.push_back([](){std::cout<<"我是一个下载任务"<<std::endl;});
//     gfuncs.push_back([](){std::cout<<"我是一个mysql任务"<<std::endl;});
//     alarm(1);//一次性闹钟，超市alarm会自动被取消
//     signal(SIGALRM,hanlder);
//     while (true)
//     {
//         pause();
//         std::cout<<"我醒来了...."<<std::endl;
//         gcount++;
//     }
//     return 0;
// }

// int main()
// {
//     alarm(10);

//     sleep(4);
//     int n = alarm(0); //0：表示取消闹钟
//     std::cout<<"n : "<<n<<std::endl;

//     return 0;
// }

// long long number = 0;

// void die(int signumber)
// {
//     printf("get a sig : %d,const : %lld\n",signumber,number);
//     exit(0);
// }

// //统计我的服务器1S可以将我的计数器累加到多少
// int main()
// {
//     //我自己会在1秒之后收到SIGALRM信号
//     alarm(1);
//     signal(SIGALRM,die);
//     while(true)
//     {
//         number++;
//         //io影响了计算速度
//         // printf("count: %d\n",number++);
//     }
//     return 0;
// }

// int mian()
// {
//     int cnt = 5;
//     while (true)
//     {
//         std::cout << "wll" << std::endl;
//         cnt--;
//         if (cnt <= 0)
//             abort();
//         sleep(1);
//     }
//     return 0;
// }

// void Usage(std::string proc)
// {
//     std::cout<<"Usage: "<<proc<<" signumber processid"<<std::endl;
// }

// //输入 kill 1 1234
// int main(int argc,char *argv[])
// {
//     if(argc != 3)
//     {
//         Usage(argv[0]);
//         exit(1);
//     }

//     int signumber = std::stoi(argv[1]);
//     pid_t id = std::stoi(argv[2]);

//     int n = ::kill(id,signumber);
//     if(n < 0)
//     {
//         perror("kill");
//         exit(2);
//     }
//     exit(0);
// }

// void Handler(int signo)
// {
//     //当对应的信号被触发，内核会将对应的信号编号，传给自定义方法
//     std::cout<<"Get a signal, signal number is : "<< signo <<std::endl;
// }

// int main()
// {
//     for(int signo = 1;signo < 32;signo++)
//     {
//         signal(signo,Handler);
//         std::cout<<"自定义捕捉信号："<<signo<<std::endl;
//     }
//     while(true)
//     {
//         std::cout<<"wll love"<<std::endl;
//         sleep(1);
//     }
//     return 0;
// }
